const fs = require('fs').promises; // 改用异步文件操作模块
const path = require('path');
const logger = require('../logger')

/**
 * 昵称配置管理类,负责 nick_names.json 的加载、保存和修改
 * 异步改造：load/save 改为 async 方法,支持并行加载
 */
class Nicknames {
    /**
     * 构造函数
     * @param {string} configDir - 配置文件所在的目录路径
     */
    constructor(configDir) {
        this.nicknamesMap = {}; // 存储昵称映射表
        this.configPath = path.join(configDir, 'nick_names.json');
    }

    /**
     * 异步加载昵称配置文件（核心改造：async + 异步IO）
     * - 文件不存在时自动创建默认配置
     * - 加载失败时使用空对象兜底,不终止程序
     * @returns {Promise<void>} 加载完成的Promise
     */
    async load() {
        try {
            // 异步检查文件是否存在（替代 fs.existsSync）
            await fs.access(this.configPath);

            // 异步读取文件（替代 fs.readFileSync）
            const data = await fs.readFile(this.configPath, 'utf8');
            const config = JSON.parse(data);

            // 验证配置结构（逻辑不变）
            if (!config.nicknames || typeof config.nicknames !== 'object') {
                throw new Error('配置文件格式错误,缺少 nicknames 字段或类型不正确');
            }

            this.nicknamesMap = config.nicknames;
            logger.info(`✅昵称配置加载完成（${Object.keys(this.nicknamesMap).length}条）`);
        } catch (err) {
            // 分错误类型处理：文件不存在 → 新建默认配置；其他错误 → 空配置兜底
            if (err.code === 'ENOENT') {
                // 异步创建默认配置文件（替代 fs.writeFileSync）
                const defaultConfig = {
                    nicknames: {},
                    last_updated: new Date().toISOString()
                };
                await fs.writeFile(this.configPath, JSON.stringify(defaultConfig, null, 4));
                this.nicknamesMap = defaultConfig.nicknames;
                logger.info('昵称配置文件不存在,已创建默认配置');
            } else {
                // 加载失败：空配置兜底,仅报错不终止程序（逻辑不变）
                const errMsg = err?.message || "未知错误";
                logger.error('⚠️ 昵称配置加载失败,使用空配置:', errMsg);
                throw err
            }
        }
    }

    /**
     * 异步保存昵称配置到文件（核心改造：async + 异步IO）
     * - 保存失败时仅报错,不影响程序继续运行
     * @returns {Promise<void>} 保存完成的Promise
     */
    async save() {
        try {
            const config = {
                nicknames: this.nicknamesMap,
                last_updated: new Date().toISOString()
            };
            // 异步写入文件（替代 fs.writeFileSync）
            await fs.writeFile(this.configPath, JSON.stringify(config, null, 4));
            logger.info('昵称配置已保存');
        } catch (err) {
            // 保存失败仅报错,不终止程序（逻辑不变）
            logger.error('⚠️ 昵称配置保存失败:', err.message);
        }
    }

    // 以下业务方法完全不变（与IO无关,无需改造）
    /**
     * 更新昵称映射表
     * @param {string|number} key - 昵称对应的键（如角色ID）
     * @param {string} nickname - 昵称值
     */
    update(key, nickname) {
        this.nicknamesMap[key] = nickname;
    }

    /**
     * 删除指定键的昵称
     * @param {string|number} key - 要删除的昵称键
     */
    delete(key) {
        delete this.nicknamesMap[key];
    }

    /**
     * 获取昵称映射表（返回副本,避免外部直接修改原对象）
     * @returns {Object} 昵称键到昵称值的映射对象
     */
    getMap() {
        return { ...this.nicknamesMap }; // 新增：返回副本,防止外部篡改原数据
    }
}

module.exports = Nicknames;